/**
 * 那么这里我们需要注意两个问题：
 * 1：无论在ES还是在TS中类成员的属性都是实例属性而不是原型属性，而类成员的方法呢都是实例方法
 * 2：第二点呢与ES中不同的是实例的属性必须具有初始值或者在构造函数中被初始化
 * */
// 一个类基本的实现
class Dog {
  protected constructor(name: string) {
    this.name = name;
  }
  public name: string;
  // name?: string; // ? 可选属性
  run() {}
  private pri(){} // 私有成员
  protected pro(){} // 受保护成员
  readonly legs: number = 4; // 只读属性
  static food: string = 'bones'; // 静态成员
}
console.log(Dog.prototype); // 输出原型看不到`name`属性，只有`constructor`和`run`
// let dog = new Dog('wangwang');
// console.log(dog); // 这里可以看到`name`属性，证明`name`属性不在原型上
// dog.pri(); // 私有成员不能被调用
// dog.pro(); // 受保护成员不能被调用
console.log(Dog.food);
// console.log(dog.food);


// 类的继承

// 定义一个 Dog 的子类
class Husky extends Dog{
  // color 因为添加了 public 所以它变成了实例属性
  constructor(name: string, public color: string){
    super(name); // 父类的实例
    this.color = color;
    // this.pri(); // 属性“pri”为私有属性，只能在类“Dog”中访问
    this.pro(); // 受保护成员可以在子类中调用
  }
  // color: string;
}
console.log(Husky.food);

// 类的成员修饰符

// 类的所有属性呢默认都是public它的含义就是对所有人都是可见的
// 私有成员只能在类的本身被调用而不能被类的实例调用也不能被子类调用
// 另外呢我们也可以给构造函数加上私有成员属性那么这个作用呢就是这个类既不能被实例化也不能被继承
// 一个受保护成员`protected`呢只能在类或者子类中访问而不能在类的实例中访问，构造函数也能被声明成 protected 这个作用呢就是这个类不能被实例化而只能被继承就相当于申明了一个基类
